# Лекция: Jackson и его аннотации для XML в Java

Jackson предоставляет множество аннотаций, которые позволяют настраивать преобразование объектов в XML и обратно.

## Аннотация @JacksonXmlProperty

Аннотация `@JacksonXmlProperty` позволяет указать имя элемента XML.

```java
public class Product {
    @JacksonXmlProperty(localName = "product_id")
    private int id;
    @JacksonXmlProperty(localName = "product_name")
    private String name;
    @JacksonXmlProperty(localName = "product_price")
    private double price;
    // геттеры и сеттеры
}
```

## Аннотация @JacksonXmlRootElement

Аннотация `@JacksonXmlRootElement` позволяет указать имя корневого элемента XML.

```java
@JacksonXmlRootElement(localName = "Product")
public class Product {
    private int id;
    private String name;
    private double price;
    // геттеры и сеттеры
}
```

## Аннотация @JacksonXmlElementWrapper

Аннотация `@JacksonXmlElementWrapper` позволяет указать имя обертки для коллекций.

```java
public class Order {
    private int id;
    private int userId;
    @JacksonXmlElementWrapper(localName = "Products")
    private List<Product> products;
    // геттеры и сеттеры
}
```

---

# Практические задания

1. **Создайте класс `Product` с полями `id`, `name` и `price`. Используйте аннотацию `@JacksonXmlProperty` для указания имен элементов XML. Преобразуйте объект `Product` в XML.** (Сложность: 1/5)
```java
public class Product {
    @JacksonXmlProperty(localName = "product_id")
    private int id;
    @JacksonXmlProperty(localName = "product_name")
    private String name;
    @JacksonXmlProperty(localName = "product_price")
    private double price;
    // геттеры и сеттеры
}

Product product = new Product();
product.setId(1);
product.setName("Apple");
product.setPrice(0.99);

XmlMapper xmlMapper = new XmlMapper();
String xml = xmlMapper.writeValueAsString(product);
System.out.println(xml); // выводит <Product><product_id>1</product_id><product_name>Apple</product_name><product_price>0.99</product_price></Product>
```

2. **Преобразуйте XML в объект `Product`.** (Сложность: 1/5)
```java
String xml = "<Product><product_id>1</product_id><product_name>Apple</product_name><product_price>0.99</product_price></Product>";

XmlMapper xmlMapper = new XmlMapper();
Product product = xmlMapper.readValue(xml, Product.class);
System.out.println(product.getName()); // выводит "Apple"
```

3. **Создайте класс `Order` с полями `id`, `userId` и `products` (список `Product`). Используйте аннотацию `@JacksonXmlElementWrapper` для указания имени обертки для списка продуктов. Преобразуйте объект `Order` в XML.** (Сложность: 2/5)
```java
public class Order {
    private int id;
    private int userId;
    @JacksonXmlElementWrapper(localName = "Products")
    private List<Product> products;
    // геттеры и сеттеры
}

Order order = new Order();
order.setId(1);
order.setUserId(1);
order.setProducts(Arrays.asList(product));

XmlMapper xmlMapper = new XmlMapper();
String xml = xmlMapper.writeValueAsString(order);
System.out.println(xml); // выводит XML с тегом <Products> для списка продуктов
```

4. **Преобразуйте XML в объект `Order`.** (Сложность: 2/5)
```java
String xml = "<Order><id>1</id><userId>1</userId><Products><Product><product_id>1</product_id><product_name>Apple</product_name><product_price>0.99</product_price></Product></Products></Order>";

XmlMapper xmlMapper = new XmlMapper();
Order order = xmlMapper.readValue(xml, Order.class);
System.out.println(order.getProducts().get(0).getName()); // выводит "Apple"
```

5. **Создайте класс `User` с полями `id`, `name`, `email` и `orders` (список `Order`). Используйте аннотации `@JacksonXmlRootElement` и `@JacksonXmlElementWrapper` для указания имен элементов XML. Преобразуйте объект `User` в XML и обратно.** (Сложность: 3/5)
```java
@JacksonXmlRootElement(localName = "User")
public class User {
    private int id;
    private String name;
    private String email;
    @JacksonXmlElementWrapper(localName = "Orders")
    private List<Order> orders;
    // геттеры и сеттеры
}

User user = new User();
user.setId(1);
user.setName("John Doe");
user.setEmail("john.doe@example.com");
user.setOrders(Arrays.asList(order));

XmlMapper xmlMapper = new XmlMapper();
String xml = xmlMapper.writeValueAsString(user);
System.out.println(xml); // выводит XML

User parsedUser = xmlMapper.readValue(xml, User.class);
System.out.println(parsedUser.getName()); // выводит "John Doe"
```